﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioFuncionario
    {
        private IRepositorioFuncionario _repositorioFuncionario;

        /// <summary>
        /// 
        /// </summary>
        public NegocioFuncionario()
        {
            _repositorioFuncionario = new RepositorioFuncionario();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns></returns>
        public Funcionario Inserir(Funcionario funcionario)
        {
            funcionario.Codigo = GeradorCodigo.GerarCodigo(1);
            funcionario.Codigo += (_repositorioFuncionario.ObterUltimoIdCodigoInteiro() + 1).ToString();
            funcionario.Codigo += GeradorCodigo.GerarCodigo(1, funcionario.Codigo);
            return _repositorioFuncionario.Inserir(funcionario);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="funcionario"></param>
        /// <returns></returns>
        public Funcionario Atualizar(Funcionario funcionario)
        {
            return _repositorioFuncionario.Atualizar(funcionario);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="funcionario"></param>
        public void Excluir(Funcionario funcionario)
        {
            Funcionario funcionarioTmp = ObterPorId(funcionario.FuncionarioId);
            _repositorioFuncionario.Excluir(funcionarioTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<Funcionario> ObterTodos()
        {
            return _repositorioFuncionario.ObterTodos();
        }

        public IList<Funcionario> ObterTodosFuncionarios(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string codigo,
           string descricao, string cargoCodigo, string cargoDescricao, string setorCodigo, string setorDescricao, decimal previsaoSalarialDe, 
           decimal previsaoSalarialAte, decimal salarioAnteriorDe, decimal salarioAnteriorAte, decimal percentualUltimoReajusteDe, decimal percentualUltimoReajusteAte,
           DateTime? ultimoReajusteDe, DateTime? ultimoReajusteAte, DateTime? contratacaoDe, DateTime? contratacaoAte,
            DateTime? demissaoDe, DateTime? demissaoAte)
        {

            if (previsaoSalarialAte == 0)
            {
                previsaoSalarialAte = previsaoSalarialDe;
            }

            if (salarioAnteriorAte == 0)
            {
                salarioAnteriorAte = salarioAnteriorDe;
            }

            if (percentualUltimoReajusteAte == 0)
            {
                percentualUltimoReajusteAte = percentualUltimoReajusteDe;
            }

            if (!ultimoReajusteAte.HasValue)
            {
                ultimoReajusteAte = ultimoReajusteDe;
            }

            if (!contratacaoAte.HasValue)
            {
                contratacaoAte = contratacaoDe;
            }

            if (!demissaoAte.HasValue)
            {
                demissaoAte = demissaoDe;
            }

            return _repositorioFuncionario.ObterTodos(inicio, quantidade, quantidadeMinima, codigo, descricao, cargoCodigo,
                cargoDescricao, setorCodigo, setorDescricao, previsaoSalarialDe, previsaoSalarialAte, salarioAnteriorDe, 
                salarioAnteriorAte,  percentualUltimoReajusteDe,percentualUltimoReajusteAte, ultimoReajusteDe, ultimoReajusteAte, 
                contratacaoDe, contratacaoAte, demissaoDe, demissaoAte);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Funcionario ObterPorId(int id)
        {
            return _repositorioFuncionario.ObterPorId(id);
        }

        public Funcionario ObterPorCodigo(string codigo)
        {
            return _repositorioFuncionario.ObterPorCodigo(codigo);
        }

        public IList<Funcionario> ObterPorCargo(int inicio, int quantidade, int quantidadeMinima, Cargo cargo)
        {
            return _repositorioFuncionario.ObterPorCargo(inicio, quantidade, quantidadeMinima,cargo);
        }

        public Funcionario ObterPorPessoa(Pessoa pessoa)
        {
            return _repositorioFuncionario.ObterPorPessoa(pessoa);
        }

        public IList<Funcionario> ObterPorSetor(int inicio, int quantidade, int quantidadeMinima, Setor setor)
        {
            return _repositorioFuncionario.ObterPorSetor(inicio, quantidade, quantidadeMinima,setor);
        }

        public IList<Funcionario> ObterPorDescricao(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            return _repositorioFuncionario.ObterPorDescricao(inicio, quantidade, quantidadeMinima,descricao);
        }

        public Funcionario ObterPorCpf(string cpf)
        {
            return _repositorioFuncionario.ObterPorCpf(cpf);
        }
    }
}